#include "player.h"
#include <QPainter>
#include <QtDebug>

// 构造函数：初始化角色
Player::Player(QGraphicsItem *parent)
    : QGraphicsItem(parent),
      m_direction(0),
      mCurrentFrame(),
      m_StandingDirection(),
      mState(Standing)
{
    // 设置图元不能超出自身边界
    setFlag(ItemClipsToShape);

    // 加载各种状态下的图像资源
    mWalkPixmap = QPixmap(":/images/march7_walk_t.png");           // 行走动画图集
    mStandingPixmap = QPixmap(":/images/march7_walk_t.png");   // 站立图像
    mJumpPixmap = QPixmap(":/images/march7_walk_t.png");      // 跳跃图像
    standShootPixmap = QPixmap(":/images/march7_walk_t.png");  // 开火图像（使用站立图）
    mFrozenPixmap = QPixmap(":/images/March7_frozen.png");
    mPixmap = mWalkPixmap;  // 默认显示为行走图像
}

Player::~Player() {}

// 动作切换状态控制
void Player::stand() {
    mPixmap = mStandingPixmap;
    mCurrentFrame = 0;
    mState = Standing;
}

void Player::jump() {
    mState = Jumping;
}

void Player::standShoot() {
    mPixmap = standShootPixmap;
    mCurrentFrame = 0;
    mState = StandShoot;
}

void Player::walk() {
    if (mState == Walking) return;
    mPixmap = mWalkPixmap;
    mCurrentFrame = 0;
    mState = Walking;
}

void Player::fall() {
    mState = Falling;
}

// 状态获取函数
bool Player::isFalling(){
    return mState == Falling;
}

int Player::direction() const{

    return m_direction;
}

int Player::standingDirection() const{

    return m_StandingDirection;
}

void Player::nextFrame() { // 57，1191
    if(IsFrozen){
        mCurrentFrame = 0;
    }
    else{
        mCurrentFrame += 342;  // 切换到下一帧图像
        if (mCurrentFrame >= 1024) mCurrentFrame = 0;  // 循环回第一帧
    }
}

QRectF Player::boundingRect() const {
    return QRectF(0, 0, 45, 73);  // 图元大小
}

void Player::freezeImage() {
    IsFrozen = true;
    mPixmap = mFrozenPixmap;
    mCurrentFrame = 0;
    update();
}

void Player::restoreImage() {
    IsFrozen = false;
    mPixmap = mWalkPixmap;
    mCurrentFrame = 0;
    update();
}

void Player::setPixmap(const QPixmap &pixmap) {
    mPixmap = pixmap;
    update();  // 请求重绘
}

void Player::paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *widget) {

    painter->save();
    if(IsFrozen){
        painter->drawPixmap(0,0,45,73, mFrozenPixmap);
    }
    else{

        qreal scaleX = 45.0 / 342.0;  // 宽度压缩比
        qreal scaleY = 73.0 / 500.0; // 高度压缩比

        painter->scale(scaleX, scaleY); // 缩放图像显示
        painter->drawPixmap(0, 0, mPixmap, mCurrentFrame, 0, 342, 500); // 原始帧大小
    }

    painter->restore();

    setTransformOriginPoint(boundingRect().center());

//    painter->drawPixmap(0, 0, mPixmap, mCurrentFrame, 0, 45, 73);  // 绘制当前帧
//    //将贴图mPixmap中从(mCurrentFrame, 0)开始的宽45高73的区域，绘制到当前图元的 (0,0) 坐标上。
//    setTransformOriginPoint(boundingRect().center());             // 设置旋转中心
//    Q_UNUSED(widget); // 这些参数由 Qt 自动传入，但如果你不打算使用它们，使用 Q_UNUSED 可以防止编译器警告
}

// 方向控制
void Player::addDirection(int direction) {
    if (direction == m_direction)
        return;  // 避免重复设置

    m_direction += direction;

    if (m_direction != 0) {
        if (m_direction == -1) {
            // 朝向左：镜像翻转（X轴取反），通过 QTransform 实现
            setTransform(QTransform(-1, 0, 0, 1, boundingRect().width(), 0)); // 水平翻转并右移
        } else {
            // 朝向右：恢复正常
            setTransform(QTransform());
        }
    }
}

void Player::addStandingDirection(int standingDirection){
    // 记录角色“静止时的朝向” 在停止行走后保持朝向不变
    m_StandingDirection = standingDirection;
}

// 碰撞检测
bool Player::isTouchingFoot(QGraphicsItem *item) {
    QRectF rect(pos().x(), pos().y() + boundingRect().height() - 5,
                boundingRect().width(), 5);
    // 构造一个矩形：覆盖玩家底部 5 像素高 的区域；
    QRectF otherRect(item->pos().x(), item->pos().y(),
                     item->boundingRect().width(), item->boundingRect().height());
    // 判断它是否和 item 的 boundingRect() 相交；
    return rect.intersects(otherRect);
    // 通常用于判断“玩家是否站在平台上”。
}

bool Player::isTouchingHead(QGraphicsItem *item){
    // 同上
    QRectF rect(pos().x(), pos().y(), boundingRect().width(), 5);
    QRectF otherRect(item->pos().x(), item->pos().y(), item->boundingRect().width(), item->boundingRect().height());
    return rect.intersects(otherRect);
}

bool Player::isTouchingPlatform(QGraphicsItem *item){
    // 通常用于判断是否可继续下落（若未碰撞则触发下落逻辑）
    QRectF rect(pos().x(), (pos().y() + boundingRect().height()) - 5, boundingRect().width(), 5);
    QRectF otherRect(item->pos().x(), item->pos().y(), item->boundingRect().width(), item->boundingRect().height());
    return rect.intersects(otherRect);
}
